home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / ldbmp08 / ldbmp08s.lzh / LDBMP4.S < prev    next >
Text File  |  1997-06-11  |  14KB  |  693 lines

  1. *****************************************************************
  2. *    16色のBMP                        *
  3. *****************************************************************
  4.     .include    doscall.mac
  5.     .include    iocscall.mac
  6.     .include    myconst.h
  7.  
  8.     .xdef    _Rle4_extend
  9.     .xdef    _Bit4_prt
  10.     .xdef    _Bit4_scroll
  11.  
  12.     .xref    key_chk
  13.     .xref    tenkey_chk
  14.     .xref    cursor_chk
  15.     .xref    mouse_chk
  16.  
  17.     .xref    x_set
  18.     .xref    y_set
  19.     .xref    v_wait
  20.     .xref    inf_change
  21.  
  22.     .xref    line_byte
  23.     .xref    tate
  24.     .xref    yoko
  25.     .xref    crt_y
  26.     .xref    x_max
  27.     .xref    y_max
  28.     .xref    x_pos
  29.     .xref    y_pos
  30.     .xref    gr_addr
  31.     .xref    fi_size
  32.     .xref    buff_addr
  33.  
  34.     .xref    kflg
  35.     .xref    esc_flg
  36.     .xref    next_flg
  37.     .xref    scroll_key
  38.     .xref    s_dot4
  39.  
  40.     .text
  41.     .even
  42.  
  43. *****************************************************************
  44. *    RLE4展開                        *
  45. *****************************************************************
  46. _Rle4_extend:
  47.     bsr    tenkai
  48.     rts
  49.  
  50. *****************************************************************
  51. *    16色表示                        *
  52. *****************************************************************
  53. _Bit4_prt:
  54.     bsr    bit4_prt
  55.     rts
  56.  
  57. *****************************************************************
  58. *    スクロール                        *
  59. *****************************************************************
  60. _Bit4_scroll:
  61.     bsr    scroll
  62.     rts
  63.  
  64. *****************************************************************
  65. *    ランレングス圧縮の展開                    *
  66. *****************************************************************
  67. tenkai:
  68.     move.l    gr_addr(pc),a0        *展開元
  69.  
  70.     move.l    buff_addr(pc),a1
  71.     adda.l    fi_size(pc),a1
  72.     movea.l    a1,a2            *展開元MAX
  73.  
  74.     move.l    a1,d0            *展開先補正
  75.     btst.l    #0,d0
  76.     beq    tenkai_
  77.     addq.l    #1,a1
  78. tenkai_:
  79.     move.l    a1,gr_addr        *画像アドレス変更
  80.     movea.l    a1,a3            *取っておく
  81.  
  82.     moveq.l    #0,d2
  83.     moveq.l    #0,d3
  84.     moveq.l    #$f,d7
  85.  
  86. tenkai0:
  87.     cmpa.l    a0,a2
  88.     bls    tenkai9
  89.  
  90.     moveq.l    #0,d0
  91.     move.b    (a0)+,d0
  92.     beq    tenkai2
  93.     move.b    (a0)+,d1
  94.  
  95.     subq.w    #1,d0
  96. tenkai1:
  97.     rol.b    #4,d1
  98.     bsr    set
  99.     dbra.w    d0,tenkai1
  100.     bra    tenkai0
  101.  
  102. tenkai2:
  103.     moveq.l    #0,d0
  104.     move.b    (a0)+,d0
  105.  
  106.     cmp.b    #1,d0
  107.     bcs    tenkai5
  108.     beq    tenkai9
  109. *    cmp.b    #2,d0            *無視
  110. *    bne    tenkai2_
  111. *    addq.l    #2,a0
  112. *    bra    tenkai0
  113.  
  114. tenkai2_:
  115.     btst.l    #0,d0            *偶数か
  116.     bne    tenkai4            *違う
  117.  
  118. tenkai3:
  119.     lsr.w    #1,d0
  120.     subq.w    #1,d0
  121.     move.w    d0,d5
  122. tenkai3_:
  123.     move.b    (a0)+,d1
  124.     rol.b    #4,d1
  125.     bsr    set
  126.     rol.b    #4,d1
  127.     bsr    set
  128.     dbra.w    d0,tenkai3_
  129.     btst.l    #0,d5
  130.     bne    tenkai3__
  131.     addq.l    #1,a0
  132. tenkai3__:
  133.     bra    tenkai0
  134.  
  135. tenkai4:
  136.     cmp.w    #1,d0
  137.     bne    tenkai4_
  138.     move.b    (a0)+,d1
  139.     rol.b    #4,d1
  140.     bsr    set
  141.     addq.l    #1,a0
  142.     bra    tenkai0
  143.  
  144. tenkai4_:
  145.     lsr.w    #1,d0
  146.     subq.w    #1,d0
  147.     move.w    d0,d5
  148. tenkai4__:
  149.     move.b    (a0)+,d1
  150.     rol.b    #4,d1
  151.     bsr    set
  152.     rol.b    #4,d1
  153.     bsr    set
  154.     dbra.w    d0,tenkai4__
  155.     move.b    (a0)+,d1
  156.     rol.b    #4,d1
  157.     bsr    set
  158.     btst.l    #0,d5
  159.     beq    tenkai4___
  160.     addq.l    #1,a0
  161. tenkai4___:
  162.     bra    tenkai0
  163.  
  164. tenkai5:
  165.     tst.w    d3
  166.     beq    tenkai5_
  167.     bsr    set
  168. tenkai5_:
  169.     adda.w    line_byte(pc),a3    *展開アドレスの補正
  170.     movea.l    a3,a1
  171.     bra    tenkai0
  172.  
  173. tenkai9:
  174.     tst.w    d3
  175.     beq    tenkai9_
  176.     bsr    set
  177. tenkai9_:
  178.     rts
  179.  
  180. set:
  181.     move.w    d1,d4
  182.     and.w    d7,d4
  183.     rol.w    #4,d2
  184.     or.w    d4,d2
  185.     not.w    d3
  186.     bne    set9
  187.     move.b    d2,(a1)+
  188.     moveq.l    #0,d2
  189. set9:
  190.     rts
  191.  
  192. *****************************************************************
  193. *    表示                            *
  194. *****************************************************************
  195. bit4_prt:
  196.     movea.l    gr_addr(pc),a1        *グラフィックデータの先頭
  197.  
  198.     move.w    x_pos(pc),gram_x    *GRAMの表示座標
  199.     move.w    y_pos(pc),gram_y
  200.  
  201.     clr.w    bmp_x            *BMPの表示座標(x,y)
  202.     clr.w    bmp_y
  203.  
  204.     move.w    yoko(pc),d0
  205.     cmp.w    #1024,d0
  206.     bcs    bit4_prt1
  207.     move.w    #1024,d0
  208. bit4_prt1:
  209.     move.w    d0,bmp_xd        *bmp_xdot
  210.  
  211.     move.w    tate(pc),d7
  212.     cmp.w    #1024,d7
  213.     bcs    bit4_prt2
  214.     move.w    #1024,d7
  215. bit4_prt2:
  216.     move.w    d7,bmp_yd        *bmp_ydot
  217. **    sub.w    crt_y(pc),d7        *自動スクロール用
  218.  
  219.     move.w    tate(pc),d0        *グラフィックデータの先頭アドレス
  220.     subq.w    #1,d0            *(tate-1-bmp_x)*line_byte+gr_addr
  221.     sub.w    bmp_x(pc),d0
  222.     mulu.w    line_byte(pc),d0
  223.     add.l    gr_addr(pc),d0
  224.     movea.l    d0,a1
  225.  
  226.     move.w    gram_x(pc),d0        *表示先画像アドレス
  227.     move.w    gram_y(pc),d1        *gram_y*2048+gram_x*2+$c00000
  228.     swap.w    d1
  229.     clr.w    d1
  230.     ror.l    #5,d1
  231.     add.w    d0,d0
  232.     add.w    d0,d1
  233.     movea.l    d1,a2
  234.     adda.l    #GRAM,a2
  235.  
  236.     bsr    bit4_put        *表示
  237.     rts
  238.  
  239. bit4_put:
  240.     move.w    bmp_xd(pc),d0        *横ドット数
  241.     move.w    bmp_yd(pc),d2        *縦ドット数
  242.  
  243.     move.w    d0,d1            *表示元データの1ライン上へのバイト数
  244.     addq.w    #1,d1
  245.     lsr.w    #1,d1
  246.     add.w    line_byte(pc),d1
  247.     movea.w    d1,a3
  248.  
  249.     move.w    #1024,d1        *表示先データの1ライン下までのバイト数
  250.     sub.w    d0,d1
  251.     add.w    d1,d1
  252.     movea.w    d1,a4
  253.  
  254.     cmpi.b    #MC68060,MPUTYPE
  255.     bcc    bit4_put0
  256.  
  257.     move.w    d0,d1            *横ドットが16で割り切れるか
  258.     andi.w    #$000f,d1
  259.     beq    bit4_16            *そう
  260.  
  261. bit4_put0:
  262.     btst.l    #0,d0            *横ドットが奇数か?
  263.     bne    bit4_put4        *そう
  264.  
  265.     subq.w    #1,d2            *縦-1
  266.     lsr.w    #1,d0            *横/2-1
  267.     subq.w    #1,d0
  268. bit4_put2:                *横ドット=偶数
  269.     move.w    d0,d1            *横ループ
  270. bit4_put3
  271.     move.b    (a1)+,d3
  272.     move.b    d3,d4
  273.  
  274.     lsr.b    #4,d3            *上位4ビットを変換
  275.     move.w    d3,(a2)+
  276.  
  277.     move.w    d4,(a2)+        *下位4ビットを変換
  278.     dbra    d1,bit4_put3
  279.     suba.l    a3,a1            *変換元アドレス更新
  280.     adda.l    a4,a2            *変換先アドレス更新
  281. **    move.w    d7,d3
  282. **    sub.w    d2,d3
  283. **    bmi    bit4_put3_
  284. **    move.w    d3,$e8001a        *スクロール
  285. **bit4_put3_
  286.     dbra    d2,bit4_put2
  287.     rts
  288.  
  289.  
  290. bit4_put4:                *横ドット数=奇数
  291.     subq.w    #1,d2            *縦-1
  292.     lsr.w    #1,d0            *横/2-1
  293.     subq.w    #1,d0
  294. bit4_put5
  295.     move.w    d0,d1            *横ループ
  296. bit4_put6
  297.     move.b    (a1)+,d3
  298.     move.b    d3,d4
  299.  
  300.     lsr.b    #4,d3            *上位4ビットを変換
  301.     move.w    d3,(a2)+
  302.  
  303.     move.w    d4,(a2)+        *下位4ビットを変換
  304.     dbra    d1,bit4_put6
  305.  
  306.     move.b    (a1)+,d3        *上位4ビットのみ変換
  307.     lsr.b    #4,d3
  308.     move.w    d3,(a2)+
  309.  
  310.     suba.l    a3,a1            *変換元アドレス更新
  311.     adda.l    a4,a2            *変換先アドレス更新
  312. **    move.w    d7,d3
  313. **    sub.w    d2,d3
  314. **    bmi    bit4_put6_
  315. **    move.w    d3,$e8001a        *スクロール
  316. **bit4_put6_
  317.     dbra    d2,bit4_put5
  318.     rts
  319.  
  320. bit4_16:                *横ドット数が16で割り切れる時
  321.     lea.l    work_buf(pc),a5        *ワークアドレス
  322.     lsr.w    #4,d0            *横/16-1
  323.     subq.w    #1,d0
  324.     subq.w    #1,d2            *縦-1
  325.  
  326. bit4_16_0:
  327.     move.w    d0,d1            *横ループ
  328. bit4_16_1:
  329.     move.l    (a1)+,d3
  330.     movep.l    d3,1(a5)
  331.     ror.l    #4,d3
  332.     movep.l    d3,(a5)
  333.  
  334.     move.l    (a1)+,d3
  335.     movep.l    d3,9(a5)
  336.     ror.l    #4,d3
  337.     movep.l    d3,8(a5)
  338.  
  339.     movem.l    (a5),d3-d6
  340.     movep.l    d3,1(a2)
  341.     movep.l    d4,9(a2)
  342.     movep.l    d5,17(a2)
  343.     movep.l    d6,25(a2)
  344.     lea.l    32(a2),a2
  345.  
  346.     dbra.w    d1,bit4_16_1
  347.  
  348. bit4_16_2:
  349.     suba.l    a3,a1            *変換元アドレス更新
  350.     adda.l    a4,a2            *変換先アドレス更新
  351. **    move.w    d7,d3
  352. **    sub.w    d2,d3
  353. **    bmi    bit4_16_put2_
  354. **    move.w    d3,$e8001a        *スクロール
  355. **bit4_16_put2_
  356.     dbra.w    d2,bit4_16_0
  357.     rts
  358.  
  359. *****************************************************************
  360. *    スクロール制御                        *
  361. *****************************************************************
  362. scroll:
  363.     moveq.l    #0,d2            *スクロール座標初期化
  364.     moveq.l    #0,d3
  365. **    move.w    y_max(pc),d3
  366.     move.w    d2,x_old
  367.     move.w    d3,y_old
  368.  
  369.     bsr    down_demo
  370.     bsr    right_demo
  371.  
  372.     tst.b    kflg            *キー入力待ち
  373.     beq    scroll8            *指定無し
  374. scroll2:
  375.     bsr    key_chk            *キー入力チェック
  376.  
  377.     tst.b    esc_flg            *エスケープ入力有るか
  378.     bne    scroll9            *指定有り
  379.     tst.b    next_flg        *ネクスト入力有るか
  380.     bne    scroll9            *指定有り
  381.  
  382.     bsr    cursor_chk        *カーソルキーからの入力チェック
  383.     bsr    tenkey_chk        *テンキーからの入力チェック
  384.     bsr    scroll_set16        *
  385.     bsr    mouse_chk4        *マウスからの入力チェック
  386.     bsr    lim_chk            *範囲チェック
  387.     bsr    go_scroll        *スクロール実行
  388.     bra    scroll2            *キー入力に戻る
  389.  
  390. scroll8:
  391.     bsr    key_chk            *ESCくらいは入力チェック
  392.     bsr    mouse_chk4        *
  393. scroll9:
  394.     rts
  395.  
  396. *****************************************************************
  397. *    下方向へ全画面スクロールを行う                *
  398. *****************************************************************
  399. down_demo:
  400.     tst.w    y_max
  401.     beq    down_demo9
  402.  
  403.     move.w    s_dot4(pc),-(sp)
  404.     lsr.w    s_dot4
  405. down_demo0:
  406.     bsr    key_chk
  407.     bsr    cursor_chk
  408.     bsr    tenkey_chk
  409.     bsr    mouse_chk
  410.     tst.b    scroll_key
  411.     bne    down_demo8
  412.     tst.b    esc_flg
  413.     bne    down_demo8
  414.     tst.b    next_flg
  415.     bne    down_demo8
  416.  
  417.     bsr    go_scroll
  418.     add.w    s_dot4(pc),d3        *スクロール速度
  419.     cmp.w    y_max(pc),d3
  420.     bls    down_demo0
  421.     move.w    y_max(pc),d3
  422.     bsr    go_scroll
  423. down_demo8:
  424.     move.w    (sp)+,s_dot4
  425. down_demo9:
  426.     rts
  427.  
  428. *****************************************************************
  429. *    右方向へ全画面スクロールを行う                *
  430. *****************************************************************
  431. right_demo:
  432.     tst.w    x_max
  433.     beq    right_demo9
  434.     tst.w    d3
  435.     bne    right_demo9
  436. *    move.w    y_max(pc),d0
  437. *    cmp.w    x_max(pc),d0
  438. *    bhi    right_demo9
  439.  
  440.     move.w    s_dot4(pc),-(sp)
  441.     lsr.w    s_dot4
  442. right_demo0:
  443.     bsr    key_chk
  444.     bsr    cursor_chk
  445.     bsr    tenkey_chk
  446.     bsr    mouse_chk
  447.     tst.b    scroll_key
  448.     bne    right_demo8
  449.     tst.b    esc_flg
  450.     bne    right_demo8
  451.     tst.b    next_flg
  452.     bne    right_demo8
  453.  
  454.     bsr    go_scroll
  455.     add.w    s_dot4(pc),d2        *スクロール速度
  456.     cmp.w    x_max(pc),d2
  457.     bls    right_demo0
  458.     move.w    x_max(pc),d2
  459.     bsr    go_scroll
  460. right_demo8:
  461.     move.w    (sp)+,s_dot4
  462. right_demo9:
  463.     rts
  464.  
  465. *****************************************************************
  466. *    スクロール                        *
  467. *****************************************************************
  468. scroll_set16:
  469.     moveq.l    #0,d0
  470.     move.b    scroll_key(pc),d0
  471.     add.w    d0,d0
  472.     add.w    d0,d0
  473.     movea.l    scroll_tbl(pc,d0.w),a0
  474.     jsr    (a0)
  475.     rts
  476.  
  477. scroll_tbl:
  478.     .dc.l    null            *0000    入力無し
  479.     .dc.l    left            *0001    左
  480.     .dc.l    up            *0010    上
  481.     .dc.l    left_up            *0011    上左
  482.     .dc.l    right            *0100    右
  483.     .dc.l    null            *0101    右左
  484.     .dc.l    right_up        *0110    右上
  485.     .dc.l    up            *0111    右上左
  486.     .dc.l    down            *1000    下
  487.     .dc.l    left_down        *1001    下左
  488.     .dc.l    null            *1010    下上
  489.     .dc.l    left            *1011    下上左
  490.     .dc.l    right_down        *1100    下右
  491.     .dc.l    down            *1101    下右左
  492.     .dc.l    right            *1110    下右上
  493.     .dc.l    null            *1111    下右上左
  494.     .even
  495.  
  496. *****************************************************************
  497. *    入力無し                        *
  498. *****************************************************************
  499. null:
  500.     rts
  501.  
  502. *****************************************************************
  503. *    上へ                            *
  504. *****************************************************************
  505. up:
  506.     sub.w    s_dot4(pc),d3
  507.     rts
  508.  
  509. *****************************************************************
  510. *    右上へ                            *
  511. *****************************************************************
  512. right_up:
  513.     add.w    s_dot4(pc),d2
  514.     sub.w    s_dot4(pc),d3
  515.     rts
  516.  
  517. *****************************************************************
  518. *    右へ                            *
  519. *****************************************************************
  520. right:
  521.     add.w    s_dot4(pc),d2
  522.     rts
  523.  
  524. *****************************************************************
  525. *    右下へ                            *
  526. *****************************************************************
  527. right_down:
  528.     add.w    s_dot4(pc),d2
  529.     add.w    s_dot4(pc),d3
  530.     rts
  531.  
  532. *****************************************************************
  533. *    下へ                            *
  534. *****************************************************************
  535. down:
  536.     add.w    s_dot4(pc),d3
  537.     rts
  538.  
  539. *****************************************************************
  540. *    左下へ                            *
  541. *****************************************************************
  542. left_down:
  543.     sub.w    s_dot4(pc),d2
  544.     add.w    s_dot4(pc),d3
  545.     rts
  546.  
  547. *****************************************************************
  548. *    左へ                            *
  549. *****************************************************************
  550. left:
  551.     sub.w    s_dot4(pc),d2
  552.     rts
  553.  
  554. *****************************************************************
  555. *    左上へ                            *
  556. *****************************************************************
  557. left_up:
  558.     sub.w    s_dot4(pc),d2
  559.     sub.w    s_dot4(pc),d3
  560.     rts
  561.  
  562. *****************************************************************
  563. *    マウスからの入力をチェックする                *
  564. *****************************************************************
  565. mouse_chk4:
  566.     IOCS    _MS_GETDT        *マウスからのデータをGET
  567.  
  568.     cmpi.b    #$ff,d0            *右ボタンが押されたか
  569.     beq    mouse_right        *押された
  570.     andi.w    #$ff00,d0        *左ボタンが押されたか
  571.     bne    mouse_left        *押された
  572.  
  573.     swap    d0
  574.     move.w    d0,d1
  575.     andi.w    #$ff00,d0
  576.     andi.w    #$00ff,d1
  577.     ror.l    #8,d0
  578.  
  579. ms_x_chk:                *X方向の移動量を調べる
  580.     tst.b    d0
  581.     beq    ms_y_chk
  582.     blt    ms_xm            *移動量がマイナスの時飛ぶ
  583.     cmp.b    #2,d0
  584.     bls    ms_x_chk2
  585.     subq.b    #1,d0
  586.     add.b    d0,d0            *移動量を二倍にする
  587. ms_x_chk2:
  588.     add.w    d0,d2            *移動量を加算する
  589.     bra    ms_y_chk
  590. ms_xm:                    *移動量がマイナスのとき
  591.     neg.b    d0            *移動量をプラスにする
  592.     cmp.b    #2,d0
  593.     bls    ms_xm2
  594.     subq.b    #1,d0
  595.     add.b    d0,d0            *移動量を二倍にする
  596. ms_xm2:
  597.     sub.w    d0,d2            *移動量を減算する
  598.  
  599. ms_y_chk:                *Y方向の移動量を調べる
  600.     tst.b    d1
  601.     beq    mouse_chk_end
  602.     blt    ms_ym            *移動量がマイナスの時飛ぶ
  603.     cmp.b    #2,d1
  604.     bls    ms_y_chk2
  605.     subq.b    #1,d1
  606.     add.b    d1,d1            *移動量を二倍にする
  607. ms_y_chk2:
  608.     add.w    d1,d3            *移動量を加算する
  609.     bra    mouse_chk_end
  610. ms_ym:                    *移動量がマイナスのとき
  611.     neg.b    d1            *移動量をプラスにする
  612.     cmp.b    #2,d1
  613.     bls    ms_ym2
  614.     subq.b    #1,d1
  615.     add.b    d1,d1            *移動量を二倍にする
  616. ms_ym2:
  617.     sub.w    d1,d3            *移動量を減算する
  618. mouse_chk_end:
  619.     rts
  620.  
  621. mouse_right:
  622.     andi.w    #$ff00,d0        *更に左ボタンが押されたか
  623.     bne    mouse_right1        *押された
  624.     bsr    inf_change        *情報表示の変更
  625. mouse_right0:
  626.     IOCS    _MS_GETDT        *マウスからのデータをGET
  627.     cmpi.b    #$ff,d0            *右ボタンが押されたか
  628.     bne    mouse_right2        *押されいない
  629.     andi.w    #$ff00,d0        *左ボタンが押されたか
  630.     bne    mouse_right1        *押された
  631.     bra    mouse_right0
  632. mouse_right1:
  633.     st    esc_flg            *ESCスイッチON
  634. mouse_right2:
  635.     rts
  636.  
  637. mouse_left:
  638.     st    next_flg        *NEXTスイッチON
  639.     rts
  640.  
  641. *****************************************************************
  642. *    座標の範囲チェックを行う                *
  643. *****************************************************************
  644. lim_chk:            *X座標のチェックを行う
  645.     tst.w    d2
  646.     bge    lim_chk2
  647.     clr.w    d2
  648. lim_chk2:
  649.     cmp.w    x_max(pc),d2
  650.     bls    lim_chk3
  651.     move.w    x_max(pc),d2
  652. lim_chk3:            *Y座標のチェックを行う
  653.     tst.w    d3
  654.     bge    lim_chk4
  655.     clr.w    d3
  656. lim_chk4:
  657.     cmp.w    y_max(pc),d3
  658.     bls    lim_chk5
  659.     move.w    y_max(pc),d3
  660. lim_chk5:
  661.     rts
  662.  
  663. *****************************************************************
  664. *    グラフィック画面のスクロールを行う            *
  665. *****************************************************************
  666. go_scroll:
  667.     bsr    v_wait
  668.     bsr    x_set
  669.     bsr    y_set
  670.     rts
  671.  
  672. *****************************************************************
  673. *    ワークエリア                        *
  674. *****************************************************************
  675.     .bss
  676.     .even
  677.  
  678. gram_x    .ds.w    1            *表示する座標(GRAM)
  679. gram_y    .ds.w    1
  680.  
  681. bmp_x    .ds.w    1            *表示する座標(BMP)
  682. bmp_y    .ds.w    1
  683. bmp_xd    .ds.w    1            *表示するドット数
  684. bmp_yd    .ds.w    1
  685.  
  686. x_old:
  687.     .ds.w    1            *前回のX座標
  688. y_old:
  689.     .ds.w    1            *前回のY座標
  690. work_buf:
  691.     .ds.b    16
  692.     .even
  693.